package com.atguigu.tingshu.album.api;

import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.anno.GuiGuLogin;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "专辑管理")
@RestController
@RequestMapping("api/album/albumInfo")
@Validated
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoApiController {

	@Autowired
	private AlbumInfoService albumInfoService;

	//保存专辑信息

	/**
	 * 保存专辑信息
	 *
	 * @param albumInfoVo 专辑信息数据传输对象
	 * @return 操作结果
	 */
	@Operation(summary = "保存专辑信息") // 定义操作摘要为“保存专辑信息”
	@PostMapping("saveAlbumInfo") // 映射POST请求到saveAlbumInfo路径
	@GuiGuLogin // 声明该方法需要登录后才能访问
	public Result save(@RequestBody AlbumInfoVo albumInfoVo) {
		// 调用albumInfoService的saveAlbumInfo方法，传入专辑信息数据传输对象和当前用户ID
		albumInfoService.saveAlbumInfo(albumInfoVo, AuthContextHolder.getUserId());
		// 返回操作成功的结果
		return Result.ok();
	}

	/**
	 * 分页查询用户专辑
	 *
	 * @param page 页码
	 * @param limit 每页条数
	 * @param albumInfoQuery 查询对象，如果不传，则使用默认值
	 * @return 查询结果，包含分页信息和专辑列表
	 */
	@GuiGuLogin // 声明该方法需要登录后才能访问
	@Operation(summary = "分页查询用户专辑")
	@PostMapping("findUserAlbumPage/{page}/{limit}")
	public Result<IPage<AlbumListVo>> findUserAlbumPage(
			// 定义一个名为"page"的参数，描述为"页码"，且为必填项
			@Parameter(name = "page" , description="页码" ,required = true)
			// 使用@PathVariable注解将URL中的变量映射到方法参数中，此处映射的是页码变量
			@PathVariable Long page,

			// 定义一个名为"limit"的参数，描述为"每页条数"，且为必填项
			@Parameter(name = "limit" , description="每页条数" ,required = true)
			// 使用@PathVariable注解将URL中的变量映射到方法参数中，此处映射的是每页显示条数的变量
			@PathVariable Long limit,

			// 定义一个名为"albumInfoQuery"的参数，描述为"查询对象"，且为非必填项
			@Parameter(name = "albumInfoQuery" , description="查询对象" ,required = false)
			// 使用@RequestBody注解将请求体中的JSON数据自动绑定到AlbumInfoQuery类型的对象上
			@RequestBody AlbumInfoQuery albumInfoQuery

	) {

		// 设置查询对象的用户ID为当前用户的ID
		albumInfoQuery.setUserId(AuthContextHolder.getUserId());
		// 调用albumInfoService的findUserAlbumPage方法，传入页码、每页条数和查询对象，获取分页查询结果
		IPage<AlbumListVo> iPage  = albumInfoService.findUserAlbumPage(page, limit, albumInfoQuery);
		// 返回查询结果，使用Result.ok封装分页查询结果
		return Result.ok(iPage);
	}

	/**
	 * 删除专辑信息
	 *
	 * @param id 专辑ID
	 * @return 删除结果
	 */
	@Operation(summary = "删除专辑信息") // 声明操作摘要，说明该方法用于删除专辑信息
	@DeleteMapping("removeAlbumInfo/{id}") // 映射删除专辑信息的HTTP DELETE请求到该方法
	public Result removeAlbumInfoById(@PathVariable Long id) {
		// 调用专辑信息服务中的删除专辑信息方法，传入专辑ID作为参数
		albumInfoService.removeAlbumInfoById(id);
		// 返回删除操作成功的结果
		return Result.ok();
	}

	/**
	 * 根据ID查询专辑信息
	 *
	 * @param id 专辑的ID
	 * @return 包含专辑信息的Result对象
	 */
	@GuiGuLogin // 声明该方法需要登录后才能访问
	// 使用@Operation注解描述方法，summary为"根据ID查询专辑信息"
	@Operation(summary = "根据ID查询专辑信息")
	// 使用@GetMapping注解映射HTTP GET请求到该方法，路径为"/getAlbumInfo/{id}"
	@GetMapping("getAlbumInfo/{id}")
	public Result<AlbumInfo> getAlbumInfoById(@PathVariable @Min(2) @Max(10) Long id) {
		// 调用albumInfoService的getAlbumInfoById方法，传入id参数，获取专辑信息
		// 然后使用Result.ok方法将专辑信息封装为Result对象并返回
		return Result.ok(albumInfoService.getAlbumInfoById(id));
	}

	/**
	 * 更新专辑信息
	 *
	 * @param id 专辑ID，通过路径变量获取
	 * @param albumInfoVo 专辑信息对象，通过请求体接收
	 * @return 操作成功的结果
	 */
	@GuiGuLogin // 声明该方法需要登录后才能访问
	// 定义一个操作，其摘要为“更新专辑信息”
	@Operation(summary = "更新专辑信息")
	// 映射PUT请求到/updateAlbumInfo/{id}路径
	@PutMapping("/updateAlbumInfo/{id}")
	public Result updateAlbumInfo(
			// 通过路径变量获取专辑ID
			@PathVariable Long id,
			// 通过请求体接收专辑信息对象
			@RequestBody AlbumInfoVo albumInfoVo) {
		// 调用albumInfoService的updateAlbumInfoById方法，传入专辑ID和专辑信息对象，更新专辑信息
		albumInfoService.updateAlbumInfoById(id,albumInfoVo);
		// 返回操作成功的结果
		return Result.ok();
	}

	@GuiGuLogin // 声明该方法需要登录后才能访问
	@Operation(summary = "查询用户所有专辑列表")
	@GetMapping("findUserAllAlbumList")
	public Result<List<AlbumInfo>> findUserAllAlbumList(){
		List<AlbumInfo> albumInfoList = albumInfoService.findUserAllAlbumList(AuthContextHolder.getUserId());
		return Result.ok(albumInfoList);
	}

}

